home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / tip / csar.tip < prev    next >
Text File  |  1993-09-15  |  4KB  |  115 lines

  1. % This macro source file is from the four volume series
  2. % "TeX in Practice" by Stephan von Bechtolsheim, published
  3. % 1993 by Springer-Verlag, New York.
  4. % Copyright 1993 Stephan von Bechtolsheim.
  5. % No warranty or liability is assumed.
  6. % This macro may be copied freely if no fees other than
  7. % media cost or shipping charges are charged and as long
  8. % as this copyright and the following source code itself
  9. % is not changed. Please see the series for further information.
  10. %
  11. % Version: 1.0
  12. % Date: May 1, 1993
  13. %
  14. %
  15. % This source code is documented in 19.2.2, p. III-78.
  16. % Original source in file "tokens2.TEX", starting line 640.
  17. \wlog{L: "csar.tip" ["tokens2.TEX," l. 640, p. III-78]}%
  18. % This file DOES belong to format "texip."
  19. \InputD{doloop.tip}
  20. \InputD{rangetst.tip}
  21. \InputD{compst.tip}
  22. \InputD{strleng.tip}
  23. \catcode`\@ = 11
  24. \newcount\@CreateArrayCount
  25. \def\CCreateArray #1#2#3{%
  26.     \NameEdef{#1-low}{\number#2}%
  27.     \NameEdef{#1-high}{#3}%
  28.     \ifnum #3<#2
  29.         \errmessage{\string\CCreateArray: low array boundary
  30.             \number#2 is larger than upper array boundary
  31.             \number#3}%
  32.     \fi
  33.     \DoLoop{\@CreateArrayCount}{#2}{1}{#3}{%
  34.         \NameDef{#1-\the\@CreateArrayCount}{}%
  35.     }
  36. }
  37. \newcount\@ConvertStringIntoArrayLength
  38. \newcount\@ConvertStringIntoArrayCount
  39. \def\ConvertStringIntoArray #1#2{%
  40.     \def\@ConvertArrayName{#1}%
  41.     \edef\@ConvertArrayString{#2}%
  42.     \StringLength{\@ConvertArrayString}%
  43.     \@ConvertStringIntoArrayLength = \StringLengthResult
  44.     \advance\@ConvertStringIntoArrayLength by -1
  45.     \CCreateArray{\@ConvertArrayName}%
  46.         {0}{\the\@ConvertStringIntoArrayLength}%
  47.     \@ConvertStringIntoArrayCount = 0
  48.     \expandafter\@ConvertStringIntoArray
  49.         \@ConvertArrayString\@ConvertEnd
  50. }
  51. \def\@ConvertStringIntoArray #1#2\@ConvertEnd{%
  52.     \CLoadArrayElementEdef{\@ConvertArrayName}%
  53.         {\the\@ConvertStringIntoArrayCount}{#1}%
  54.     \if\EmptyStringConditional{#2}%
  55.         \def\@ConvertStringIntoArrayNext{}%
  56.     \else
  57.         \advance\@ConvertStringIntoArrayCount by 1\relax
  58.         \def\@ConvertStringIntoArrayNext{%
  59.             \@ConvertStringIntoArray #2\@ConvertEnd%
  60.         }%
  61.     \fi
  62.     \@ConvertStringIntoArrayNext
  63. }
  64. \def\CCheckIndex #1#2{%
  65.     \expandafter\ifx\csname #1-low\endcsname\relax
  66.         \errmessage{\string\CCheckIndex: no array #1.}%
  67.     \fi
  68.     \ifnum #2<\NameUse{#1-low}%
  69.         \errmessage{Index #2 for array #1 too small.}%
  70.     \fi
  71.     \ifnum #2>\NameUse{#1-high}%
  72.         \errmessage{Index #2 for array #1 too large.}%
  73.     \fi
  74. }
  75. \def\CArrayAccess #1#2#3{%
  76.     \CCheckIndex{#1}{#2}%
  77.     \edef#3{\NameUse{#1-#2}}%
  78. }
  79. \newcount\@CArrayAccessIntervalCount
  80. \def\CArrayAccessInterval #1#2#3#4{%
  81.     \CCheckIndex{#1}{#2}%
  82.     \CCheckIndex{#1}{#3}%
  83.     \ifnum #2>#3\relax
  84.         \errmessage{\string\CArrayAccessInterval: low index
  85.             (\PoundSignText 2) > high index
  86.             (PoundSignText 3).}%
  87.     \fi
  88.     \def#4{}%
  89.     \DoLoop
  90.         {\@CArrayAccessIntervalCount}{#2}{1}{#3}{%
  91.         \CArrayAccess{#1}{\the\@CArrayAccessIntervalCount}%
  92.             {\@CArrayAccessInterval}%
  93.         \edef#4{#4\@CArrayAccessInterval}%
  94.     }%
  95. }
  96. \def\CLoadArrayElement #1#2#3{%
  97.     \CCheckIndex{#1}{#2}%
  98.     \NameDef{#1-#2}{#3}%
  99. }
  100. \def\CLoadArrayElementEdef #1#2#3{%
  101.     \CCheckIndex{#1}{#2}%
  102.     \NameEdef{#1-#2}{#3}%
  103. }
  104. \newcount\@CShowArrayCount
  105. \def\CShowArray #1{%
  106.     \DoLoop
  107.         {\@CShowArrayCount}%
  108.         {\NameUse{#1-low}}% 
  109.         {1}% 
  110.         {\NameUse{#1-high}}%
  111.         {\wlog{Index \the\@CShowArrayCount:
  112.             \NameUse{#1-\the\@CShowArrayCount}}}%
  113. }
  114. \catcode`\@ = 12
  115.